
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

/**
 * AUTO-GENERATED FILE. DO NOT MODIFY.
 */

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
import { __extends } from 'tslib';
import SeriesData from '../../data/SeriesData.js';
import * as zrUtil from 'zrender/lib/core/util.js';
import { defaultEmphasis } from '../../util/model.js';
import Model from '../../model/Model.js';
import createGraphFromNodeEdge from '../helper/createGraphFromNodeEdge.js';
import LegendVisualProvider from '../../visual/LegendVisualProvider.js';
import SeriesModel from '../../model/Series.js';
import { createTooltipMarkup } from '../../component/tooltip/tooltipMarkup.js';
import { defaultSeriesFormatTooltip } from '../../component/tooltip/seriesFormatTooltip.js';
import { initCurvenessList, createEdgeMapForCurveness } from '../helper/multipleGraphEdgeHelper.js';

var GraphSeriesModel =
/** @class */
function (_super) {
	__extends(GraphSeriesModel, _super);

	function GraphSeriesModel() {
		var _this = _super !== null && _super.apply(this, arguments) || this;

		_this.type = GraphSeriesModel.type;
		_this.hasSymbolVisual = true;
		return _this;
	}

	GraphSeriesModel.prototype.init = function (option) {
		_super.prototype.init.apply(this, arguments);

		var self = this;

		function getCategoriesData() {
			return self._categoriesData;
		} // Provide data for legend select

		this.legendVisualProvider = new LegendVisualProvider(getCategoriesData, getCategoriesData);
		this.fillDataTextStyle(option.edges || option.links);

		this._updateCategoriesData();
	};

	GraphSeriesModel.prototype.mergeOption = function (option) {
		_super.prototype.mergeOption.apply(this, arguments);

		this.fillDataTextStyle(option.edges || option.links);

		this._updateCategoriesData();
	};

	GraphSeriesModel.prototype.mergeDefaultAndTheme = function (option) {
		_super.prototype.mergeDefaultAndTheme.apply(this, arguments);

		defaultEmphasis(option, 'edgeLabel', ['show']);
	};

	GraphSeriesModel.prototype.getInitialData = function (option, ecModel) {
		var edges = option.edges || option.links || [];
		var nodes = option.data || option.nodes || [];
		var self = this;

		if (nodes && edges) {
			// auto curveness
			initCurvenessList(this);
			var graph = createGraphFromNodeEdge(nodes, edges, this, true, beforeLink);
			zrUtil.each(graph.edges, function (edge) {
				createEdgeMapForCurveness(edge.node1, edge.node2, this, edge.dataIndex);
			}, this);
			return graph.data;
		}

		function beforeLink(nodeData, edgeData) {
			// Overwrite nodeData.getItemModel to
			nodeData.wrapMethod('getItemModel', function (model) {
				var categoriesModels = self._categoriesModels;
				var categoryIdx = model.getShallow('category');
				var categoryModel = categoriesModels[categoryIdx];

				if (categoryModel) {
					categoryModel.parentModel = model.parentModel;
					model.parentModel = categoryModel;
				}

				return model;
			}); // TODO Inherit resolveParentPath by default in Model#getModel?

			var oldGetModel = Model.prototype.getModel;

			function newGetModel(path, parentModel) {
				var model = oldGetModel.call(this, path, parentModel);
				model.resolveParentPath = resolveParentPath;
				return model;
			}

			edgeData.wrapMethod('getItemModel', function (model) {
				model.resolveParentPath = resolveParentPath;
				model.getModel = newGetModel;
				return model;
			});

			function resolveParentPath(pathArr) {
				if (pathArr && (pathArr[0] === 'label' || pathArr[1] === 'label')) {
					var newPathArr = pathArr.slice();

					if (pathArr[0] === 'label') {
						newPathArr[0] = 'edgeLabel';
					} else if (pathArr[1] === 'label') {
						newPathArr[1] = 'edgeLabel';
					}

					return newPathArr;
				}

				return pathArr;
			}
		}
	};

	GraphSeriesModel.prototype.getGraph = function () {
		return this.getData().graph;
	};

	GraphSeriesModel.prototype.getEdgeData = function () {
		return this.getGraph().edgeData;
	};

	GraphSeriesModel.prototype.getCategoriesData = function () {
		return this._categoriesData;
	};

	GraphSeriesModel.prototype.formatTooltip = function (dataIndex, multipleSeries, dataType) {
		if (dataType === 'edge') {
			var nodeData = this.getData();
			var params = this.getDataParams(dataIndex, dataType);
			var edge = nodeData.graph.getEdgeByIndex(dataIndex);
			var sourceName = nodeData.getName(edge.node1.dataIndex);
			var targetName = nodeData.getName(edge.node2.dataIndex);
			var nameArr = [];
			sourceName != null && nameArr.push(sourceName);
			targetName != null && nameArr.push(targetName);
			return createTooltipMarkup('nameValue', {
				name: nameArr.join(' > '),
				value: params.value,
				noValue: params.value == null
			});
		} // dataType === 'node' or empty

		var nodeMarkup = defaultSeriesFormatTooltip({
			series: this,
			dataIndex: dataIndex,
			multipleSeries: multipleSeries
		});
		return nodeMarkup;
	};

	GraphSeriesModel.prototype._updateCategoriesData = function () {
		var categories = zrUtil.map(this.option.categories || [], function (category) {
			// Data must has value
			return category.value != null ? category : zrUtil.extend({
				value: 0
			}, category);
		});
		var categoriesData = new SeriesData(['value'], this);
		categoriesData.initData(categories);
		this._categoriesData = categoriesData;
		this._categoriesModels = categoriesData.mapArray(function (idx) {
			return categoriesData.getItemModel(idx);
		});
	};

	GraphSeriesModel.prototype.setZoom = function (zoom) {
		this.option.zoom = zoom;
	};

	GraphSeriesModel.prototype.setCenter = function (center) {
		this.option.center = center;
	};

	GraphSeriesModel.prototype.isAnimationEnabled = function () {
		return _super.prototype.isAnimationEnabled.call(this) // Not enable animation when do force layout
    && !(this.get('layout') === 'force' && this.get(['force', 'layoutAnimation']));
	};

	GraphSeriesModel.type = 'series.graph';
	GraphSeriesModel.dependencies = ['grid', 'polar', 'geo', 'singleAxis', 'calendar'];
	GraphSeriesModel.defaultOption = {
		// zlevel: 0,
		z: 2,
		coordinateSystem: 'view',
		// Default option for all coordinate systems
		// xAxisIndex: 0,
		// yAxisIndex: 0,
		// polarIndex: 0,
		// geoIndex: 0,
		legendHoverLink: true,
		layout: null,
		// Configuration of circular layout
		circular: {
			rotateLabel: false
		},
		// Configuration of force directed layout
		force: {
			initLayout: null,
			// Node repulsion. Can be an array to represent range.
			repulsion: [0, 50],
			gravity: 0.1,
			// Initial friction
			friction: 0.6,
			// Edge length. Can be an array to represent range.
			edgeLength: 30,
			layoutAnimation: true
		},
		left: 'center',
		top: 'center',
		// right: null,
		// bottom: null,
		// width: '80%',
		// height: '80%',
		symbol: 'circle',
		symbolSize: 10,
		edgeSymbol: ['none', 'none'],
		edgeSymbolSize: 10,
		edgeLabel: {
			position: 'middle',
			distance: 5
		},
		draggable: false,
		roam: false,
		// Default on center of graph
		center: null,
		zoom: 1,
		// Symbol size scale ratio in roam
		nodeScaleRatio: 0.6,
		// cursor: null,
		// categories: [],
		// data: []
		// Or
		// nodes: []
		//
		// links: []
		// Or
		// edges: []
		label: {
			show: false,
			formatter: '{b}'
		},
		itemStyle: {},
		lineStyle: {
			color: '#aaa',
			width: 1,
			opacity: 0.5
		},
		emphasis: {
			scale: true,
			label: {
				show: true
			}
		},
		select: {
			itemStyle: {
				borderColor: '#212121'
			}
		}
	};
	return GraphSeriesModel;
}(SeriesModel);

export default GraphSeriesModel;